package chapter07._02_CatchException;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 * @Description:
 * @LastDate: 2020/10/31
 */
public class Test05_TryWithResources {

    /*
    * 总结：关闭资源尽可能使用try-with-resources
    *
    * 如果try抛出异常 然后finally的close也抛出异常 就很难处理
    * try-with-resources可以很好解决这个问题
    * 原来的异常会被抛出 close抛出的异常会被限制
    * close的异常都会被自动捕获然后被addSuppressed增加到原来的异常后面
    * 可以使用getSuppressed调用从close抛出并被抑制的异常
    *
    * Notes：try-with-resources也可以有catch和finally
    * 会在关闭try-with-resources的资源后执行
    * */

    /*
     * @Description: try-with-resource的最简形式
     */
    public void base() throws FileNotFoundException {
        /*
        * try语句中 无论有无异常抛出 最后都会调用in.close()
        * 就好像使用了finally语句一样
        * */
        try (var in = new Scanner(
                new FileInputStream(""), StandardCharsets.UTF_8)) {
            while (in.hasNextInt())
                System.out.println(in.next());
        }
    }

    /*
     * @Description: 使用多个资源
     */

    public void multipleResources() throws FileNotFoundException {
        /*
         * 无论try如何退出 最后in和out都会顺利关闭
         * 如果使用finally 就需要嵌套的try/finally
         * */
        try (var in = new Scanner(
                new FileInputStream(""), StandardCharsets.UTF_8);
             var out = new PrintWriter("", StandardCharsets.UTF_8)) {
            while (in.hasNextInt())
                out.println(in.next().toUpperCase());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void useDeclaredVar(String[] arr, PrintWriter out) {
        try (out) {//java9之后 这里可以使用声明好的efffectively final variables
            for (String s : arr) {
                out.println(s);
            }
        }
    }
}
